\documentclass[a4paper]{article}

%%%%% Paquetes

\usepackage[spanish]{babel} 
\usepackage[utf8]{inputenc}
\usepackage{makeidx} %Indice
\usepackage{amsmath} %Ecuaciones sin numero al costado
\usepackage{graphicx} %Imagenes
\usepackage{fancyhdr} %Para encabezado y pie de pagina
\usepackage{float}
\usepackage[top=3cm, bottom=3cm, left=2.5cm, right=2.5cm]{geometry} 
\usepackage[hidelinks]{hyperref} %Para url y links
\hypersetup{colorlinks=false}

\usepackage{longtable} %Para tablas que ocupan mas de una hoja

% Para las notas al pie dentro de tablas o tabulaciones
\usepackage{tablefootnote}

%%%%% Paquetes

\begin{document}

\pagenumbering{gobble} %No numerar la primer pagina

\begin{titlepage}
	\centering
	\includegraphics{images/logo_fiuba.png}\par\vspace{1cm}
	{\scshape\LARGE Facultad de Ingeniería \par
	Universidad de Buenos Aires  \par}
	\vspace{1.5cm}
	{\Large\bfseries Propuesta de Trabajo Profesional\par}
	\vspace{0.5cm}
	{\huge\bfseries FIUBot: Asistente Virtual Inteligente de Gestión Para Alumnos y Profesores de FIUBA \par}
	\vspace{6.5cm}
	\begin{flushleft}
	\Large\itshape{Bruno Liberini - 90899}\\
	\vspace{0.5cm}
	\Large{Tutor: XXXX} \par
	\end{flushleft}
	\vfill
% Bottom of the page
	{\large Septiembre, 2019 \par}
\end{titlepage}

  \newpage
  
  \pagenumbering{arabic} %Comenzar a numerar las paginas

  \tableofcontents % Indice
    
%%%% Cabecera y pie de pagina
  \pagestyle{fancy}
  \lhead{Bruno Liberini - Padrón 90899}
  \rhead{}
  \renewcommand{\headrulewidth}{0.4pt} % grosor de la línea de la cabecera
%%%% Cabecera y pie de pagina

  \newpage
  
  \section{Introducción}
  
  El siguiente documento presenta la propuesta del Trabajo Profesional de Ingeniería en Informática del alumno Bruno Liberini, padrón 90899. El docente que estará a cargo como tutor del trabajo profesional será XXXX. \newline
  
  El tema elegido para el trabajo profesional es \textit{“FIUBot: Asistente Virtual Inteligente de Gestión Para Alumnos y Profesores de FIUBA”}. \newline
  
  El objetivo del trabajo es aplicar los conocimientos adquiridos durante la carrera a fin de desarrollar un asistente virtual inteligente para chat de Telegram (o \textit{chatbot}) para automatizar las diferentes tareas de gestión con la universidad que docentes y alumnos deben llevar a cabo, con el objetivo de agilizar y centralizar la gestión de trámites, inscripciones y pedidos; disponer de forma transparente y centralizada la información sobre los cursos, la entrega de evaluaciones y notas, ayudar en la recolección de \textit{feedback} inmediato de los alumnos sobre cada clase, realizar las encuestas cuatrimestrales, analizar los datos y presentarlos de forma automática tanto a alumnos como profesores según lo requieran.  \newline
  
  El trabajo requerirá la aplicación de conocimientos sobre machine learning (para el desarrollo de un motor de procesamiento de lenguaje natural para el chatbot), tecnologías mobile (para la integración con Telegram), tecnologías cloud (para el desarrollo del backend), calidad en el desarrollo de software (para el control de calidad durante el desarrollo del trabajo) y administración y gestión de proyectos informáticos (para la administración del desarrollo del trabajo) \newline
  
  \subsection{Motivación}
  
  La gestión de trámites en la universidad corre hoy por hoy por distintos canales y plataformas. Para los alumnos y profesoras, la plataforma principal es SIU Guaraní\footnote{\textit{SIU Guaraní - Módulo de Gestión Académica}: \url{https://www.siu.edu.ar/siu-guarani/}}, una solución integral desarrollada por \textit{Sistema de Información Universitaria}. En él el alumno puede inscribirse a cursadas, inscribirse a exámenes, consultar su historial académico, las materias regularizadas que tiene y hacer seguimiento de las diversas gestiones que la universidad o facultad ofrezcan. Al mismo tiempo, los docentes lo utilizan para obtener listados de alumnos, para sus cursos y mesas de examen. \newline
  
  Lamentablemente esta plataforma, que es común a la gran mayoría de las instituciones de enseñanza superior del país, posee varios problemas de disponibilidad\footnote{Urgente24 (2017, Marzo 1). \textit{SIU Guaraní, Un Problema Que Ni El Informático Bullrich Puede Solucionar}. Recuperado de: \url{https://archivo.urgente24.com/262412-siu-guarani-un-problema-que-ni-el-informatico-bullrich-puede-solucionar}}. El sitio web no es responsive para dispositivos móviles (aunque recientemente publicaron una aplicación móvil), no posee certificado SSL y su experiencia de usuario es anticuada y poco práctica.  \newline
  
  Por otra parte, en cuanto a las gestiones dentro de los cursos, todos los cuatrimestres cada uno decide coordinar la comunicación con los alumnos. Para esto se utilizan distintas plataformas, como listas de e-mail, grupos de Yahoo!, de Google o de Facebook, Classrooms de Google, Campus de FIUBA o plataformas de chat como Slack. A través de ellas se administran minucias de los cursos, se hacen anuncios parroquiales, los alumnos pueden realizar preguntas, se coordina la entrega de trabajos prácticos y se devuelven las notas de las evaluaciones parciales. También es a través de ellas que usualmente se solicita la participación en las encuestas de fin de cuatrimestre del Departamento de Computación. \newline
  
  El uso de estas plataformas tiene las siguientes desventajas:
  
  \begin{itemize}
  	\item No todas las plataformas implementan todas las funcionalidades que cada curso necesita para administrarse. Esto lleva a los cursos a adoptar más de una plataforma o suplementar las falencias de la plataforma elegida "a mano" (por ejemplo, requiriendo que los alumnos además de sumarse a la plataforma anoten su dirección de e-mail en una lista para anunciarles cualquier eventualidad).
  	
  	\item Su administración requiere de un esfuerzo significativo por parte de los docentes \cite{FREQUENCY_TEACH_ONLINE}. Por ejemplo, si se quiere enviar la nota de un parcial a los alumnos personalmente (para evitar que el resto vea notas ajenas), el administrador debe enviar un mensaje a los alumnos uno por uno. Lo que implica encontrar la identificación del alumno (si es que no es el padrón o nombre), compilar el mensaje (i.e. buscar la nota correspondiente o el \textit{feedback} que corresponda) y enviarlo. Por esta razón y la criticidad del punto anterior, se crea una expectativa respecto a la disponibilidad de los profesores para responder consultas que se aproxima a 24/7.
  	
  \end{itemize}

  Finalmente, otra de las razones de que se consideró para realizar esta propuesta fue la compilación de encuestas sobre cursos. Se identificaron cuatro problemas al respecto:
  
  \begin{itemize}
  	\item La difusión de las encuestas entre los cursos no es obligatoria, por lo que hay alumnos que no la completan porque no se enteran de su existencia. 
  	
  	\item La compilación de la información y confección de un informe con los resultados tarda un tiempo considerable y no existe un canal por el cual todos los alumnos que hayan completado la encuesta se enteren de ellos.
  	
  	\item Las encuestas de fin de curso sólo sirven para obtener un \textit{feedback} final sobre el curso. Aunque algunos cursos implementan encuestas a fin de cada clase, los profesores en general no tienen devolución de los alumnos sobre las clases dadas durante la cursada, lo que impide cualquier mejora que se pueda hacer al respecto en ese momento. Esto es debido tanto a la falta de participación de los alumnos como a la falta de tiempo de los docentes para recompilar y analizar los resultados de las encuestas de quienes sí responderían.
  \end{itemize}

  Este trabajo busca entonces resolver estos problemas de forma integral a través de un asistente virtual inteligente para Telegram. Este asistente virtual permitirá la automatización de las tareas previamente mencionadas, liberando al personal docente de tareas de administración, disminuyendo el tiempo requerido en responder consultas ya respondidas con anterioridad, disminuyendo el tiempo requerido en dar devoluciones de evaluaciones a los alumnos, mejorando la experiencia de usuario, e integrando a todos los cursos en la recopilación de encuestas y confección de informes de resultados de manera automática.
  
  \newpage
  
  \section{Alcance}
  
  El alcance del trabajo contempla los siguientes puntos.
  
  \begin{enumerate}
  	\item Diseño de API del chatbot:
  	\begin{itemize}
		\item Autenticación.
		\item Consulta de clases inscriptas del alumno y cursos del docente.
	  	\item Consulta de clases, aulas y horarios.
	  	\item Consulta de fechas de evaluación: TPs, evaluaciones parciales, evaluaciones finales.
	  	\item Consulta de información sobre curso: información de docentes, correlatividades, cronogramas, bibliografía.
	  	\item Recordatorio de inscripción a exámenes y cursadas o entrega de exámenes parciales.
	  	\item Consulta de listado de alumnos del curso.
	  	\item Consulta de listado de alimnos por mesa de examen.
	  	\item Envío de notificaciones a alumnos por parte de docentes.
	  	\item Llenado de encuestas:
	  	\begin{itemize}
	  		\item Encuesta de clase: permite que el alumno complete una encuesta sobre la última clase que tuvo.
	  		\item Encuesta de fin de cuatrimestre.
	  	\end{itemize}
	  	\item Consulta de resultado de encuestas:
	  	\begin{itemize}
	  		\item Para alumnos: se les notifica cuando se termine el periodo para completar encuestas cuatrimestrales y se compila un archivo .pdf resultado de la ejecución de un Jupyter Notebook.
	  		\item Para docentes: mismo que los alumnos, pero también se les permite obtener un informe específico para sus cursos, y acceso a resultados de encuestas de clases.
	  	\end{itemize}
  	\end{itemize}
  	\item Diseño y especificación de cliente web para carga de datos utilizados por el chatbot (datos del curso, encuestas).
  	\item Diseño de arquitectura de servicios consumidos por el chatbot.
  	\item Implementación de pipeline para procesamiento de datos de feedback y encuestas.
  	\item Generación de reportes de feedback y encuentas.	
  \end{enumerate}
  
  \section{Características del trabajo}

  \subsection{Diseño y especificación del conjunto de instrucciones para el chatbot}
  
  Para que los usuarios puedan operar con el chatbot en Telegram, este debe poder reconocer lo que el usuario está pidiendo. Hay dos posibles alternativas para lograr que el bot reconozca la intención del usuario \cite{CHATBOT_TYPES}: 
  
  \begin{itemize}
  	\item Utilizar procesamiento de lenguaje natural, obteniendo un corpus con el cual entrenar un modelo y utilizar una de varias técnicas para este fin, de modo que el bot \textit{aprenda} a responder las preguntas que le hacen.
  	\item Utilizar una forma de reconocimiento de patrones. Con este enfoque, el chatbot buscará patrones dentro del texto enviado por el usuario a fin de encontrar una posible respuesta pre-cargada en su base de datos.
  \end{itemize}
    
  Se hará uso de los servicios de \textbf{Wit.ai}\footnote{\url{https://wit.ai/}} para esto. Wit.ai es una plataforma que presta una API para procesamiento de lenguaje natural. Permite transformar oraciones en datos estructurados haciendo uso de machine learning y sistemas basados en reglas, combinando ambos enfoques. De esta forma permite identificar entidades en textos, a partir de las cuales luego el chatbot puede reaccionar. Será necesario entrenar el motor de machine learning de Wit.ai con ejemplos de consultas que pueda hacer el usuario, parar mejorar su capacidad de entendimiento. \newline
  
  Este paso es el más básico porque a partir de él se puede construir el workflow con el que funcionará el sistema, y determinará la forma en la cual los usuarios interacutarán con él. 
  
  \subsection{Diseño y construcción de flujo de ejecución de operaciones con el chatbot}
  
  Este paso involucra, en primer lugar, la investigación de la API que expone Telegram para el desarrollo de chatbots en sus clientes \cite{TELEGRAM_BOTS}. El bot deberá poder correr tanto en el cliente web como en desktop y mobile (el último siendo esencial para poder recibir notificaciones en el celular para novedades importantes). Habiendo decidido las instrucciones que podrá interpretar el bot en el paso anterior, aquí se implementarán y se definirá su comportamiento. Es decir: \textit{qué se hará} con la información dada o requerida. \newline
  
  El bot actuará como intermediario entre el usuario y la API alojada en la nube que albergará los datos necesarios para su funcionamiento. Su implementación deberá ser lo más \textit{lean} posible y prestando particular atención a los principios de diseño de interacción con el usuario, de forma que su uso sea lo más natural e intuitivo posible y genere la menor cantidad de frustraciones para él \cite{BOT_UX}. \newline
  
  En cuanto a la usabilidad del chatbot, se utilizarán las heurísticas de Nielsen \cite{NIELSEN} para calificarla. Aunque esta heurística cuenta con 10 puntos que una interfaz gráfica de usuario debe cumplir, se tomarán el subconjunto de 6 heurísticas que el autor y experto en interfaz humano-máquina Kevin Scott \cite{SCOTT_BOT_HEURISTICS} identifica como relevantes a la hora de juzgar la usabilidad de un chatbot: \textit{visibilidad de estado del sistema y reconocimiento en lugar de recordatorio; uso del mismo lenguaje que el usuario y ayuda a los usuarios a reconocer, diagnosticar y recuperarse de errores; control y libertar para el usuario y prevención de errores; flexibilidad y eficiencia en el uso; consistencia y estándares y diseño minimalista; ayuda y documentación}. 
  
  \subsection{API del chatbot}
  
  Entre las operaciones que debe ser capaz de resolver el bot se encuentran:
  
  \subsubsection{Autenticación}
  
  El chatbot debe al principio identificar al usuario cuando este inicia la conversación. Para ello le pedirá un método de autenticación, en principio las mismas credenciales que utilizan para SIU Guaraní: número de DNI y contraseña. De esta forma también podrá identificar el rol del usuario: si es un alumno o un docente.
  
  \subsubsection{Consulta de clases inscriptas del alumno y cursos del docente}
  
  El chatbot debe poder responder al pedido de las clases a las cuales está inscripto un alumno, y los cursos que tiene asignado un docente. Debe poder devolver la información de cada una, incluido día, horario y aula asignada. También debe poder identificar cuál es la clase a la cual debe concurrir en un día particular. Por ejemplo, ante la consulta "¿qué materia curso mañana?" debe poder identificar si mañana el alumno tiene alguna materia para cursar, y de tenerla devolver la información antes detallada.
  
  \subsubsection{Consulta de clases, aulas y horarios}
  
  El chatbot debe poder entender y responder con la información solicitada a preguntas sobre:
  
  \begin{itemize}
  	\item Días, horarios y aulas de cursada
  	\item Información de los docentes: nombres, cargo, contacto
  	\item Correlatividades
  	\item Fechas de evaluación
  	\item Nombres de profesores e información de contacto
  	\item Cronograma de clases, descargado como PDF
  	\item Bibliografía recomendada
  \end{itemize}

  Para materias en las cuales el alumno esté inscripto.
  
  \subsubsection{Consulta de fechas de evaluación}
  
  El chatbot debe poder entender preguntas sobre evaluaciones (entregas de TP, parciales o finales) sobre cada materia en que esté inscripto el alumno. Debe devolver el día de la evaluación y la hora.
  
  \subsubsection{Recordatorio de inscripción a exámenes y cursadas o entrega de exámenes parciales}
  
  El chatbot debe enviar notificaciones a los alumnos cuando se acerque la fecha de inscripción a exámenes y cursadas (con una semana de anticipación y el día del evento) y de entrega de exámenes parciales, sean TPs o parciales (con dos semanas de anticipación y el día del evento).
  
   \subsubsection{Consulta de listado de alumnos del curso}
   
   El chatbot debe poder entender cuando un usuario docente le pide el listado de alumnos de uno de sus cursos y devolvérselo, incluyendo nombres y padrones de los alumnos inscriptos.
   
   \subsubsection{Envío de notificaciones a alumnos por parte de profesores}
   
   El chatbot debe poder entender cuando un usuario docente quiere enviar una notificación a los alumnos de uno de sus cursos y enviarles el mensaje ingresado por él. De esta forma el profesor puede alertar a sus alumnos de alguna emergencia como clases suspendidas, cambio de horario o cambio de aula, o enviarles recordatorios no cubiertos por otra funcionalidad del chatbot (o reforzarlos).
   
   \subsubsection{Consulta de listado de alumnos por mesa de examen}
   
   El chatbot debe poder entender cuando un usuario profesor le pide el listado de alumnos de las mesas de examen que tiene, incluyendo nombres, padrones y cuatrimestre en que regularizó la materia.
  
  \subsubsection{Llenado de  encuestas}
  
  El chatbot debe poder responder al pedido de dar feedback a través de encuestas por parte de un usuario alumno. Debe guiar al alumno a través de las preguntas de cada encuesta:
  
  \begin{itemize}
  	\item En el caso de querer dar feedback de una clase, el chatbot deberá checkear que el alumno ya no lo haya hecho y que la clase correspondiente haya sido impartida. 
  	\item En el caso de querer completar la encuesta de final de cuatrimestre, esta estará habilitada luego del último día de clases
  \end{itemize}

  Al mismo tiempo, los usuarios docentes o quienes no estén subscriptos al cuatrimestre actual no podrán acceder a ningún tipo de encuestas para el curso. 
  
  \subsubsection{Consulta de resultado de encuestas}
  
  El chatbot debe poder responder al pedido de consultar el resultado de encuestas cuatrimestrales por parte del usuario. 
  
  \begin{itemize}
  	\item En el caso de los usuarios alumnos, se le notificará cuando se haya cerrado el periodo de llenado de encuestas y se hayan procesado los resultados; recibirán un archivo .pdf con el resultado del análisis de encuestas según la ejecución de un Jupyter Notebook cargado en el sistema.
  	\item En el caso de los usuarios docentes, además se les permite obtener un informe específico para sus cursos (habiéndose cargado un Jupyter Notebook) a partir de las encuestas cuatrimestrales y acceso a resultados de encuestas de clases (también a través de un informe .pdf resultado de la ejecución de un Jupyter Notebook).
  \end{itemize} 

  El chatbot debe poder además negarle el acceso a los usuarios cuando ningún tipo de encuesta esté lista para consulta.
  
  \subsection{Diseño y especificación de cliente web para carga de datos}
  
  Para no sobrecargar al chatbot y a fin de no usar su API para tareas de carga de datos, que puede ser tediosa y poco intuitiva para hacer en modo chat, se requiere el desarrollo de un cliente web. Este cliente web actuará como un backend a donde sólo tengan acceso los administradores del sistema, simulando la carga de datos desde un sistema externo como SIU Guaraní. 
  
  Las siguientes son las operaciones de carga de datos que se requieren implementar:
  
  \begin{enumerate}
  	\item Carga de usuarios: esta opción cargará los usuarios simulando la información que se almacena en SIU Guaraní.
  	\begin{itemize}
  		\item Para los usuarios alumnos: nombre, padrón, materias donde está inscripto, materias en final.
  		\item Para los docentes: nombre, información de contacto, cursos, mesas de examen.
  	\end{itemize}
    \item Carga de cursos: esta opción cargará la información de un curso.
    \begin{itemize}
    	\item Horarios: días y horas, especificando si es teórica, práctica, teórico-práctica o de consulta.
    	\item Aula: aula y sede.
    	\item Docentes.
    	\item Alumnos inscriptos.
    	\item Correlatividades.
    	\item Fechas de evaluaciones: fechas tentativas (rango de fechas) o fechas puntuales, especificando el tipo de evaluación: TP o evaluación parcial.
    	\item Cronograma: en formato .pdf.
    \end{itemize}
	\item Carga de mesas de examen: especificando día, hora, aula, sede y materia.
	\item Carga de encuestas: esta opción cargará tanto las preguntas a contestar en encuestas de clase y cuatrimestrales.
	\item Carga de código de informes: esta opción cargará el Jupyter Notebook que se utilizará para computar los resultados de las encuestas.
	\begin{itemize}
		\item Uno para las encuestas cuatrimestrales.
		\item Uno para las encuestas de clase.
		\item Uno específico para cada los cursos de cada docente.
	\end{itemize}
  \end{enumerate}
  
  Este cliente web guardará la información en un servidor \textit{cloud} que servirá al chatbot con la información que necesita para realizar sus operaciones.
  
  \subsection{Diseño de arquitectura de servicios}
  
  Como se mencionó, el bot debe poder recibir feedback de los usuarios, enviar notificaciones y procesar la información recibida para responder consultas y generar reportes que los usuarios puedan usar. 
  
  Con este fin, se desea implementar esta capa de servicios utilizando tecnologías \textit{cloud} \cite{CLOUD}. Para agilizar la respuesta del chatbot (uno de los requerimientos de este trabajo) se emplearán tácticas que mejoran la disponibilidad y performance de esta capa:
  
  \begin{itemize}
  	\item \textbf{Uso de \textit{autoscaling} (auto escalado)}. El autoescalado permite incrementar la cantidad de recursos en un cluster de servidores cloud según parámetros establecidos; en general este parámetro es la carga del sistema. Este método permitirá al sistema crecer en recursos para procesamiento cuando la carga incremente y reducirlos cuando la carga disminuya automáticamente sin tiempos muertos que afecten la disponibilidad, y sin que se vea afectada la concurrencia o performance por estar todos los requests esperando usar los mismos recursos.
  	
  	\item \textbf{Introducción de capa de \textit{load-balancing}} entre el cliente y los servidores \cite{TACTICS_CLOUD}. Un load balancer permitirá que la carga no recaiga en un mismo servidor, permitiendo redireccionar tráfico a servidores que no estén ocupados en el momento (o tengan menos carga sobre ellos).
  	
  	\item \textbf{Uso de bases de datos NoSQL} \cite{TACTICS_CLOUD}. El acceso a datos es uno de los pasos más lentos en el sistema, y las bases de datos NoSQL permiten la escritura y lectura rápida de altas cantidades de datos. Aunque en este caso no se trata de un problema de \textit{big data}, estas características también ayudan a la performance del sistema. Las bases de datos NoSQL también permiten escalar mejor a través de \textit{sharding}. 
  	
  	\item \textbf{Introducción de cache} a fin de evitar el reprocesamiento de reportes y el acceso de lectura a base de datos recurrente \cite{TACTICS_CLOUD}. De esta forma se mejora la performance (al ser el acceso al cache mucho más rápido que el acceso a memoria o el procesamiento del reporte) al mismo tiempo que la concurrencia (al no tener que esperar a que se liberen recursos ocupados en alguna de estas dos operaciones).
  \end{itemize}

  Todas las plataformas cloud antes mencionadas ofrecen servicios que cubren estas tácticas. Por ejemplo, Amazon Web Services \cite{AWS_PRODUCTS} ofrece autoscaling con sus Auto Scaling Groups, load-balancing con Elastic Load Balancing, servidores de bases de datos NoSQL como DynamoDB o DocumentDB y ElastiCache para caching (Redis o Memcached).
  
  \subsection{Implementación de pipeline para procesamiento de datos de feedback y encuestas}
  
  A fin de agilizar el procesamiento de estadísticas de las encuestas, se plantea la construcción de un pipeline para procesar las encuestas. Para este fin se utilizará una base de datos NoSQL, Jupyter Notebooks y la librería Papermill \cite{PAPERMILL} para ejecutarlos. \newline
  
  Cuando el usuario envía respuestas a una encuesta, el chatbot las guardará en una base de datos NoSQL alojada en la nube. Estas respuestas se procesarán con una periodicidad parametrizada utilizando Papermill, según el tipo de encuestas que sean, a través del notebook "fuente" que se requiera. Según los parámetros generará distintos tipos de informe: reporte de encuestas por clase, reporte cuatrimestral general, reporte cuatrimestral por curso. Estos reportes se almacenarán en un contenedor S3 de AWS, que es donde el chatbot consultará para responder a los pedidos de reportes. Al mismo tiempo al generarse un reporte se enviará una notificación a los usuarios que puedan estar interesados (docentes en el caso del reporte por clase, alumnos en el caso del reporte cuatrimestral general).as respuestas a las encuestas se guardarán en una base de datos NoSQL que será tomado como input del notebook fuente. Luego utilizando Papermill se definirán un conjunto de parámetros para ejecutar los resultados según los distintos casos de uso (por ejemplo, si son encuestas de clase o encuestas cuatrimestrales, si se quiere ejecutar el notebook para generar reportes generales o reportes para cursos particulares). Finalmente, el notebook resultado se guardará en un contenedor S3 de AWS, que es donde el chatbot buscará los informes para retornárselos a los usuarios. \newline
    
  \section{Supuestos}
  
  El desarrollo de este trabajo se realiza sobre las siguientes hipótesis:
  
  \begin{enumerate}
  	\item Se cuenta con la información requerida de alumnos, cursos y docentes. Para ello se desarrollará un backend donde se simulará el acceso a estos datos como aparecen hoy en ese sistema. 
  	\item Los usuarios (docentes y alumnos) ya estarán registrados en el sistema. Se considera que un paso previo al despliegue de este sistema incluye la migración de los usuarios registrados en SIU Guaraní, de forma que puedan autenticarse con las mismas credenciales.
  \end{enumerate}
  
  \section{Tecnologías y Herramientas}
  
  \subsection{Plataforma: Telegram}
  
  Telegram es una plataforma de mensajería y VOIP enfocada en mensajería instantánea y comunicación en masa basada en la nube. Aunque posee un cliente web y desktop, su cliente más popular es su cliente mobile, con 365 millones de descargas hasta agosto de 2019\footnote{Business of Apps. \textit{Telegram Revenue and Usage Statistics (2019)}. (2019, Noviembre 6). Recuperado el 1 de Noviembre de 2019 de: \url{https://www.businessofapps.com/data/telegram-statistics/}.}. \newline
  
  Telegram provee de una API y documentación para el desarrollo de bots \cite{TELEGRAM_BOTS}. No necesitan un nuevo número de teléfono para instalarse. Los usuarios pueden interactuar con los bots de Telegram mandando mensajes directos a ellos o a los grupos donde estén instalados, o refiriéndose a ellos en el campo de input con @nombre y una consulta. Como otro beneficio, Telegram permite personalizar las opciones del teclado cuando se chatea con bots para tener opciones precargadas que se acceden como opciones de un menú, lo que facilita la interacción con el chatbot. \newline
  
  Telegram también cuenta con la ventaja de que todas sus comunicaciones están encriptadas con el protocolo MTProto 2.0 \cite{TELEGRAM_ENCRYPTION}, por lo que la seguridad de las consultas, operaciones y documentos desde el servidor hasta el usuario está protegida. \newline
  
  La desventaja de utilizar Telegram es que esta aplicación no es tan popular en el país como WhatsApp. WhatsApp no tiene una API que se pueda utilizar para desarrollar bots, aunque existe una solución\footnote{Jajoo, S. (2019, Enero 13). \textit{Build a WhatsApp Bot, fast}. Recuperado el 1 de Noviembre de 2019 de: \url{https://dev.to/jajoosam/build-a-whatsapp-bot-fast--2hdc}.} utilizando el servicio de Twilio, que provee de números de celular gratis y una interfaz para interactuar con los mensajes que envía o recibe. Debido a esta razón se elige desarrollar el chatbot en Telegram en vez de WhatsApp. \newline
   
  \subsection{Procesamiento de lenguaje natural: Wit.ai}
  
  Wit.ai \cite{WITAI} es una plataforma que brinda una API para procesamiento de lenguaje natural. Fue creada en 2013 y luego comprada por Facebook, aunque este decidió mantener la plataforma abierta y gratuita. Utiliza motores de machine learning y sistemas basados en reglas para poder convertir frases en formato texto (y grabaciones de voz) en datos estructurados e identificar entidades e intenciones, permitiendo accionar sobre estas. Su sistema basado en reglas (Duckling) está escrito en Haskell \cite{DUCKLING} y utiliza un parser probabilístico para detectar entidades como fechas, números, monedas o temperatura. \newline
  
  A partir de su motor para bots, Bot Engine \cite{BOTENGINE}, Wit.ai permite identificar intenciones y entidades personalizadas, basadas en reglas de negocio que el usuario vaya a utilizar, y encadenar el flujo de conversación con su feature \textit{Stories}. Por estas prestaciones y facilidades se elige utilizar la plataforma para desarrollar la inteligencia del chatbot.
  
  \subsection{Lenguaje de programación: Node.js}
  
  Tanto Telegram como Wit.ai brindan librerías para interactuar con sus servicios escritas en Node.js. Es por eso que se decide utilizar este lenguaje de programación como principal herramienta para la construcción del chatbot.
  
  \subsection{Presentación de datos: Jupyter Notebook}
  
  Jupyter Notebook \cite{JUPYTER} es un ambiente de computación interactiva basada en web para crear documentos de tipo \textit{notebook}. Utiliza entre otras herramientas IPython, un shell de Python para computación interactiva, y permite la creación de documentos en formatos HTML, PDF, LaTeX y Markdown, entre otros. Jupyter Notebook se convirtió desde hace unos años en el notebook preferido de los científicos de datos gracias a su arquitectura, su comunidad open-source y su usabilidad \cite{JUPYTER_NATURE}. Es por esta razón que se elige utilizarlo como forma de generar los informes de encuestas. 
  
  \subsection{Librería: Papermill}
  
  Papermill es una librería de nteract \cite{PAPERMILL} permite ejecutar notebooks de forma parametrizada, guardando los resultados en un notebook de salida aislado del notebook "fuente" \cite{PAPERMILL_NETFLIX}. Esto permite hacer uso de un mismo notebook "fuente" para generar distintos notebooks "salida" haciendo pequeños cambios a través de los parámetros. Papermill también controla su propio proceso en tiempo de ejecución, por lo que no se necesita un servidor o kernel de notebooks dedicado. Por estas razones se elige como pieza principal del pipeline de procesamiento de encuestas.
  
  \subsection{Herramientas}
  
  \begin{table}[htbp]
  	\begin{center}
  		\begin{tabular}{|l|l|}
  			\hline
  			\textbf{Categoría}				 			& 		\textbf{Herramientas} \\
  			\hline
  			Lenguaje de Programación					&		Node.js \\
  														&		Python \\
  														&		JavaScript \\
			\hline
			Base de datos								&		DynamoDB \\ 
			\hline
			Servicios Cloud								&		Amazon Web Services \\ 
  			\hline
  			Entorno de Desarrollo			 			&		Visual Studio Code \\ 
  														&		Jupyter Notebook \\
  			\hline
  			Control de Versiones						& 		Git \\ 
  			\hline
  			Administración y Control del Proyecto		& 		Google Docs \\
  														& 		Asana \\
  			\hline
  			Elaboración de Documentos					& 		LaTex \\
  														& 		Jupyter Notebook \\
  			\hline
  			Librerías Principales						& 		ExpressJS \\
  														& 		React \\
  														& 		Papermill \\
  														& 		node-wit \\
  														& 		node-telegram-bot-api \\
  			\hline
  		\end{tabular}
  	\end{center}
  \end{table}

  \newpage
  
  \section{Plan de trabajo}
  
  \subsection{Equipo de trabajo}
  
  \begin{itemize}
  	\item Tutor: XXXX
  	\item Estudiante: Bruno Liberini
  \end{itemize}
  
  \subsection{Metodología}
  
  Para el desarrollo de este trabajo se seguirá una adaptación de la metodología SCRUM \cite{SCRUM}. Se definirán iteraciones cuyas fechas se determinarán luego de las reuniones con el tutor, y al final de las cuales se hará entrega de un \textit{feature} del proyecto. \\
  
  Al iniciar cada iteración, se priorizarán los requerimientos con el tutor, se establecerán fechas parciales de entrega si así fuera necesario y finalmente se realizará una reunión al final de la iteración a fin de presentar el entregable desarrollado en ella (\textit{demo}). 
  
  \subsection{Estimaciones}
  
  Se realizó la estimación de las tareas en conjunto con el tutor. Todas las estimaciones están expresadas en horas reloj.
  
  \begin{longtable}{| c | l | c |}
  	\hline
  	\textbf{Iteración}	& 	\textbf{Descripción}												& 	\textbf{Estimación (h)} \\
  	\hline \hline
  	\endfirsthead
  	
  	\hline
  	\textbf{Iteración}	& 	\textbf{Descripción}												& 	\textbf{Estimación (h)} \\
  	\hline \hline
  	\endhead
  	
  	\endfoot
  	
  	\endlastfoot
  	
  	-					&	Propuesta de Trabajo Profesional 										&	45\\
  	\hline
    1					&	Configuración de entorno local 										&	  10\\
    1					&	Configuración de servicios en AWS 									&	  12\\
    1					&	Configuración de app en Wit.ai 										&	  12\\
    1					&	Configuración de bot en Telegram 									&	  9\\
    3					&	Diseño de base de datos 										&	  9\\
    3					&	Carga de datos mockup 										        &	  9\\
    \hline
    2					&	Diseño de entidades y flujo de bot en Wit.ai 								&	  18\\
    2					&	Entrenamiento de bot en Wit.ai 										&	  36\\
    2					&	Desarrollo de tests de usabilidad de bot 								&	  12\\
    2					&	Documentación flujo de bot 										&	  6\\
    \hline
    3					&	Creación de API de autenticación 									&	  6\\
    3					&	Creación de API de datos de cursos 									&	  9\\
    3					&	Creación de API de datos de fechas de evaluaciones 							&	  6\\
    3					&	Creación de API de mesas de examen 									&	  6\\
    3					&	Documentación de API 										        &	  3\\
    3					&	Desarrollo de tests sobre API 										&	  6\\
    \hline
    4					&	Integración de chatbot con API para autenticación 							&	  3\\
    4					&	Integración de chatbot con API para datos de cursos 							&	  6\\
    4					&	Integración de chatbot API para datos de fechas de evaluación 						&	  3\\
    4					&	Integración de chatbot API para mesas de examen 							&	  3\\
    4					&	Desarrollo de tests sobre integración de chatbot con API 						&	  6\\
    \hline
    5					&	Diseño de UI/markup módulo cursos del backend 								&	  9\\
    5					&	Desarrollo de comportamiento del módulo cursos del backend				    &	  9\\
    5					&	Diseño de UI/markup módulo fechas de evaluación del backend 				&	  6\\
    5					&	Desarrollo de comportamiento del módulo fechas de evaluación del backend    &	  6\\
    5					&	Diseño de UI/markup módulo mesas de examen del backend 						&	  6\\
    5					&	Desarrollo de comportamiento del módulo mesas de examen del backend    		&	  6\\
    \hline
    6					&	Integración de backend con API autenticación 								&	  3\\
    6					&	Integración de backend con API para datos de cursos 							&	  6\\
    6					&	Integración de backend con API  para datos de fechas de evaluación 					&	  3\\
    6					&	Integración de backend con API para mesas de examen 							&	  3\\
    6					&	Desarrollo de tests sobre integración de backend con API 						&	  6\\
    \hline
    7					&	Creación de API para encuestas (carga de formulario y de respuestas) 					&	  12\\
    7					&	Diseño de módulo de carga de formulario de encuestas en el backend 						&	  12\\
    7					&	Integración de backend con API para carga de formularios de encuestas 					&	  6\\
    7					&	Desarrollo de tests sobre backend para carga de formularios de encuestas 				&	  3\\
    \hline
    8					&	Diseño flujo del bot para encuestas 									&        18\\
    8					&	Integración de chatbot con API para respuestas a encuestas 						&	  6\\
    8					&	Desarrollo de tests sobre integración entre chatbot y API para 			&	12\\
    					&	respuestas a encuestas 			&	  \\
    \hline
    9					&	Implementación de pipeline para procesamiento de encuestas 						&	  24\\
    9					&	Creación de API para descarga de informes de encuestas 							&	  12\\
    9					&	Integración entre API y chatbot para consulta de informes de encuestas 					&	  3\\
    9					&	Desarrollo de tests sobre API para consulta de informes de encuestas 					&	  3\\
    \hline
    10                   &   Desarrollo de módulo de notificaciones                                         &         18\\
    10                   &   Desarrollo de tests de módulo de notificaciones                                &         9\\
    10                   &   Integración entre módulo de notificaciones y chatbot                           &         6\\
    10                   &   Desarrollo de tests sobre integración entre chatbot y módulo  				   &         6\\
    					&   de notificaciones															   &  \\
    \hline
  	-					&	Reuniones															&	16\\
  	\hline
  	-					&	Informe y Presentación												&	20\\
  	\hline
  \end{longtable}

  Además, se debe tener en cuenta el tiempo dedicado a la administración del proyecto, que se estima en 10\% del tiempo total de desarrollo e investigación.
  
   
  \begin{table}[H]
  	\centering
  	\begin{tabular}{|l|c|}
  		\hline
  		\textbf{Descripción} 	& \textbf{Esfuerzo (h)}\\
  		\hline
  		Iteración 1 			& 61\\
  		\hline
  		Iteración 2 			& 72\\
  		\hline
  		Iteración 3 			& 36\\
  		\hline
  		Iteración 4 			& 21\\
  		\hline
  		Iteración 5 			& 42\\
  		\hline
  		Iteración 6 			& 21\\
  		\hline
  		Iteración 7 			& 33\\
  		\hline
  		Iteración 8 			& 36\\
  		\hline
  		Iteración 9 			& 42\\
  		\hline
  		Iteración 10 			& 39\\
  		\hline
  		\hline
  		Otros 					& 81\\
  		\hline
  		Administración 			& 48,4\\
  		\hline
  		\hline
  		\textbf{Esfuezo Total} 	& 532,4 \\
  		\hline
  	\end{tabular}
  \end{table}
  
  \newpage
  
  \subsection{Cronograma de entregables}
  
  A continuación se hace un cronograma tentativo de entregables al finalizar cada una de las iteraciones. Estos pueden ser modificados en caso de verse necesario por el tutor o el desarrollador del proyecto. Las fechas de cada una de las entregas serán coordinadas en conjunto con el tutor.
  
  \begin{table}[htbp]
  	\begin{center}
  		\begin{tabular}{|c|l|}
  			\hline
  			\textbf{Iteración}	 	& \textbf{Entregables}\\
  			\hline
  			1 						& $\bullet$ Esquema de base de datos \\
  									& $\bullet$ Set de datos de ejemplo \\
  			\hline
  			2						& $\bullet$ Documentación de flujo de trabajo del chatbot \\
  								    & $\bullet$ Reporte de tests de usabilidad del chatbot \\
		    \hline
		    3						& $\bullet$ Documentación de los servicios de la API \\
		   							& $\bullet$ Reporte de tests de los servicios de la API \\
            \hline
            4						& $\bullet$ Funciones del chatbot con datos mockup (menos encuestas) \\
            						& $\bullet$ Reporte de tests de integración chatbot-API \\
		    \hline
		    5						& $\bullet$ Página web del backend \\
		    \hline
		    6						& $\bullet$ Funciones de carga del backend (menos encuestas) \\
		    						& $\bullet$ Reporte de tests de integración backend-API \\		    
		    \hline
		    7						& $\bullet$ Funciones de carga de formularios de encuestas en backend \\
		    						& $\bullet$ Reporte de tests de carga de formularios de encuestas en backend \\
			\hline
			8						& $\bullet$ Función de respuestas a encuestas del chatbot \\
									& $\bullet$ Reporte de tests de carga de respuestas del chatbot\\	
			\hline
			9						& $\bullet$ Función de consulta de resultados de encuestas del chatbot \\
									& $\bullet$ Reporte de tests de consultas de resultados de encuestas del chatbot\\	
			\hline
			10						& $\bullet$ Función de notificaciones del chatbot \\
									& $\bullet$ Reporte de tests de notificaciones \\					    
		    \hline
		    - 						& $\bullet$ Informe final y conclusiones del Trabajo Profesional \\
		    \hline
  		\end{tabular}
  	\end{center}
  \end{table}  	
  
  \newpage
  \section{Referencias y material consultado}
  
  \renewcommand\refname{\small}
  
  \begin{thebibliography}{X}
  	
  \bibitem{FREQUENCY_TEACH_ONLINE} Mandernach, B. J., Dailey-Hebert, A., \& Donnelli-Sallee, E. (2007). Frequency and time investment of instructors' participation in threaded discussions in the online classroom. \textit{Journal of Interactive Online Learning}, 6(1), 1-9. Recuperado el 1 de Noviembre de 2019 de: \url{https://www.ncolr.org/jiol/issues/pdf/6.1.1.pdf}
  	
  \bibitem{CHATBOT_TYPES} Abdul-Kader, S. A., \& Woods, J. C. (2015). Survey on chatbot design techniques in speech conversation systems. \textit{International Journal of Advanced Computer Science and Applications, 6(7)}. Recuperado el 1 de Septiembre de 2019 de: \url{http://repository.essex.ac.uk/21238/1/Paper_12-Survey_on_Chatbot_Design_Techniques_in_Speech_Conversation_Systems.pdf}
  
  \bibitem{BOT_UX} Velloso, M. (2017, Diciembre). Principles of bot design, \textit{Microsoft Docs}. Recuperado el 1 de Septiembre de 2019 de: \url{https://docs.microsoft.com/en-us/azure/bot-service/bot-service-design-principles?view=azure-bot-service-4.0}
  
  \bibitem{NIELSEN} Nielsen, J. (1995). \textit{10 usability heuristics for user interface design}. Nielsen Norman Group, 1(1). Recuperado el 1 de Noviembre de 2019 de: \url{http://courses.ischool.utexas.edu/rbias/2014/Spring/INF385P/files/10%20Usability%20Heuristics%20for%20User%20Interface%20Design.docx}
  	
  \bibitem{SCOTT_BOT_HEURISTICS} Scott, K. \textit{Usability Heuristics For Bots}. Recuperado el 1 de Noviembre de 2019 de: \url{https://thekevinscott.com/usability-heuristics-for-bots/}.
  
  \bibitem{TACTICS} Bass, L., Clements, P., \& Kazman, R. (2012). Software Architecture in Practice (3rd ed.). \textit{Westford, Massachusetts: Pearson Education}.
  
  \bibitem{TACTICS_CLOUD} Gorton, I., \& Klein, J. (2014). Distribution, data, deployment: Software architecture convergence in big data systems. \textit{IEEE Software, 32(3), 78-85.} Recuperado el 1 de Septiembre de 2019 de: \url{http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.683.8785&rep=rep1&type=pdf}
 
  \bibitem{CLOUD} Josep, A. D., Katz, R., Konwinski, A., Gunho, L. E. E., PatterSon, D., \& Rabkin, A. (2010). "A view of cloud computing". \textit{Communications of the ACM, 53(4)}. Recuperado el 1 de Septiembre de 2019 de: \url{https://s3.amazonaws.com/academia.edu.documents/34578652/a_view_of_cc.pdf?response-content-disposition=inline%3B%20filename%3DA_View_of_Cloud_Computing_Clearing_the_c.pdf&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWOWYYGZ2Y53UL3A%2F20190924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190924T030703Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=feb929e2aa9e5be511eaef21a88703c6991d2e7f25d7bd50405e7152d82456fc}
  	
  \bibitem{AWS_PRODUCTS} Amazon Web Services (2014). \textit{Productos de la nube}. Recuperado el 1 de Septiembre de 2019 de: \url{https://aws.amazon.com/es/products/}
  
  \bibitem{PAPERMILL} \textit{Papermill}. Recuperado el 1 de Noviembre de 2019 de: \url{https://github.com/nteract/papermill}
  
  \bibitem{PAPERMILL_NETFLIX} Netflix Technology Blog. (2018, Agosto 27). \textit{Part 2: Scheduling Notebooks at Netflix}. Recuperado el 1 de Noviembre de 2019 de: \url{https://medium.com/netflix-techblog/scheduling-notebooks-348e6c14cfd6}.
  
  \bibitem{TELEGRAM_BOTS} Telegram APIs. \textit{Bots: An introduction for developers.} (n.d.). Recuperado el 1 de Noviembre de 2019 de: \url{https://core.telegram.org/bots}.
  
  \bibitem{TELEGRAM_ENCRYPTION} Telegram APIs. \textit{End-to-End Encryption, Secret Chats}. Recuperado el 1 de Noviembre de 2019 de: \url{https://core.telegram.org/api/end-to-end}.
  
  \bibitem{WITAI} \textit{Wit.ai}. Recuperado el 1 de Noviembre de 2019 de: \url{https://wit.ai/}
  
  \bibitem{DUCKLING} Wit.ai Team. (2018, Marzo 15). \textit{Open Sourcing our new Duckling}.  Recuperado el 1 de Noviembre de 2019 de: \url{https://medium.com/wit-ai/open-sourcing-our-new-duckling-47f44b776809}.
  
  \bibitem{BOTENGINE} Wit.ai Team. (2018, Marzo 15). \textit{Bot Engine}. Recuperado el 1 de Noviembre de 2019 de: \url{https://medium.com/wit-ai/bot-engine-26af22d37fd6}.
  
  \bibitem{JUPYTER} \textit{Project Jupyter}. Recuperado el 1 de Noviembre de 2019 de: \url{https://jupyter.org/}
  
  \bibitem{JUPYTER_NATURE} Perkel, J. M. (2018, Octubre 30). \textit{Why Jupyter is data scientists' computational notebook of choice}. Recuperado el 1 de Noviembre de 2019 de: \url{https://www.nature.com/articles/d41586-018-07196-1}.
  
  \bibitem{SCRUM} \textit{SCRUM. Metodología de desarrollo de software, con ciclo de vida iterativo}. Recuperado el 1 de Julio de 2019 de: \url{http://scrummethodology.com/}
  
  \end{thebibliography}
  
  
\end{document}